package fifteenth.Java反射机制的深入应用;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class 调用setter及getter方法 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        Class<?> c = Class.forName("fifteenth.取得类的结构.Person");
        Object o = c.newInstance();
        setter(o,"name","曼哈顿",String.class);
        setter(o,"age",19,int.class);
        System.out.print("姓名：");
        getter(o,"name");
        System.out.print("年龄：");
        getter(o,"age");
    }
    public static void setter(Object obj,String att,Object value,Class<?> type) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Method method = obj.getClass().getMethod("set" + initStr(att), type);
        method.invoke(obj,value);
    }
    public static void getter(Object obj,String att) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Method method = obj.getClass().getMethod("get" + initStr(att));
        System.out.println(method.invoke(obj));
    }
    public static String initStr(String att){//解决方法名中setName setAge这种第二个单词首字符大写的问题
        String str = att.substring(0, 1).toUpperCase() + att.substring(1);
        return  str;
    }
}
/**
 * 分步说明程序思路：
 * ①设置方法名称时，本程序是直接使用的属性名称，例如name或age.但是实际上的方法名称是setName(),setAge(),getName(),getAge()
 * 这样所有属性名称的首字母需要大写，所以为了解决这样的问题，单独设置了一个方法initStr(),通过此方法将字符串中的首字母大写。
 * 首字母大写了之后再增加set及get字符擦串，已经找到对应的方法
 * ②调用setter()方法时，传入了实例化对象、要操作的属性名称（在方法中会将其首字母大写）、要设置的参数内容以及具体的参数类型，
 *      这样做是为了满足getMethod()和invoke()方法的使用要求。
 * ③在调用getter()方法时，也同样传入了同一个实例化对象，因为其本身不需要任何的接收参数，所以只传入了属性名称（在方法中会将其首字母大写），
 *  并在此方法中将内容打印输出。
 *  以上的程序是在反射调用方法时的重要引用用，读者一定要掌握其中原理。因为在日后的开发中，很多系统会为开发者是实现好以上的功能。
 */
/*
D:\WorkSpaces\Java\jdk-21\bin\java.exe "-javaagent:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\lib\idea_rt.jar=54319:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\WorkSpaces\JavaDevelopBase_start_329\out\production\JavaDevelopBase_start_329 fifteenth.Java反射机制的深入应用.调用setter及getter方法
姓名：曼哈顿
年龄：19

Process finished with exit code 0

 */